/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tfc.exuoc.controladors;

import edu.uoc.tfc.exuoc.model.Item;
import edu.uoc.tfc.exuoc.model.Contenidor;


import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.hibernate.HibernateException;
import edu.uoc.tfc.exuoc.errors.NoExisteixException;
import edu.uoc.tfc.exuoc.errors.BuitException;
import edu.uoc.tfc.exuoc.errors.LlistatDAOException;
import edu.uoc.tfc.exuoc.config.Config;



/**
 * classe que contindrà totes les funcionalitats dels objectes Item,
 * estableix la connexió amb l'objecte DAO per obtenir/enviar els objectes
 * de tipus Ítem
 * @author emoreno
 */
public class GestorCerques {
    private static Integer numItems=Config.valorNullInt;
    private ItemsDAO dao= new ItemsDAO();

    private GestorLogs log=GestorLogs.getLogger(this.getClass().getName());

    public GestorLogs getLogexuoc() {
        return log;
    }

    public void setLogexuoc(GestorLogs log) {
        this.log = log;
    }


    public Iterator<Contenidor> llistatContenidors(String camp,String valorCercat,int ini, int fi) throws HibernateException, LlistatDAOException{
        Iterator<Contenidor> ll = null;
        GestorContenidors gCon =GestorContenidors.getInstance();
        ll=gCon.llistat(camp, valorCercat, ini, fi);
        gCon.tancar();
        return ll;

    }

    public Iterator<Item> llistatItems() throws HibernateException, BuitException {
        //Iterator<Item> llista=null;
        return dao.llista();
    }
    public Iterator<Item> llistatItems(int ini, int fi)throws HibernateException, BuitException {
        Iterator<Item> llista=null;
        List<Item> llistaAcotada=new LinkedList<Item>();
        Item item=null;

        llista=this.llistatItems();
        for (int i=0; (i<=fi)&&(llista.hasNext());i++){
            item=llista.next();
            if (ini<=i ) {
                llistaAcotada.add(item);
            }

        }
        return llistaAcotada.iterator();
    }

    public Iterator<Item> llistatItems(String ordre, int quants )throws HibernateException, BuitException {

        Iterator<Item> llistaAcotada;

        llistaAcotada=dao.llista(ordre, quants);

        return llistaAcotada;
    }

    public Iterator<Item> llistaTopTen( ) throws HibernateException, BuitException {

        return dao.llista("visites", "desc", 10);
    }

    public Iterator<Item> llistaUltimsItems() throws HibernateException, BuitException{

        return this.llistatItems("desc", Config.nUltimsItems);
    }
    
    // Mètode que tancarà la sessió oberta un cop ja no calgui
    public void  tancar() throws HibernateException{
        try{
            dao.tancarConnexio();
            dao=null;
        }catch(HibernateException e){
            this.getLogexuoc().error("Hi ha hagut un error realitzant el tancament amb la base de dades.{} ", e.getLocalizedMessage());
        }catch(NullPointerException e){
            this.getLogexuoc().error("Gestor cerques ja tancat o null.{} ", e.getLocalizedMessage());
        }

    }
        /**
     *
     * @return Nombre d'ítems del sistema
     */
    public int numItems() throws HibernateException,BuitException{
        int nItems=0;
       /* if (GestorItems.numItems.equals(Config.valorNullInt) ||
                (GestorItems.numItems <0)) {
            //Obtenim el valor d'ítems
        *
        */
            try{
                nItems=dao.quantsItems();
                if (nItems>0)  GestorCerques.numItems=nItems;
                else throw new BuitException("Classe Items, count="+String.valueOf(nItems));
            }catch (HibernateException e){
                    this.getLogexuoc().error("Error en conèixer el nombre d'ítems.{}",e.getLocalizedMessage());
                    throw e ;
            }
        //}
        return GestorCerques.numItems;
    }
    /**
     *
     * @param augment , 1=augmenta en 1, -1=disminueix un valor
     * @return retorna el nombre d'ítems +1
     * @throws HibernateException
     * @throws BuitException
     */
    public int numItems(Integer augment) throws HibernateException,BuitException{

        //s'obté de la base de dades el nou valor
        Integer nouValor=this.numItems();

        if (augment.equals(1)) nouValor++;
        else if (augment.equals(-1) && nouValor > 0) nouValor--;

        GestorCerques.numItems=nouValor;

        return GestorCerques.numItems;
    }


    /**
     *
     * @return Tenim una visita més per a un ítem id donat
     */
    public int mesVisita(Long id) throws HibernateException, NoExisteixException{
        int visites=0;

            try{
                visites=dao.mesVisita( id);

            }catch (HibernateException e){
                    this.getLogexuoc().error("Error accecint a la bdd per actualitza les visites de l'ítem :{}",id.toString());

            }catch (NoExisteixException e){
                    this.getLogexuoc().error("L'id indicat no existeix. Id :{}",id.toString());
            }catch (BuitException e){
                    this.getLogexuoc().error("L'id indicat no existeix. Id :{}",id.toString());
            }
        return visites;
    }

public int nombreVisites(Long id) throws HibernateException, NoExisteixException{
        int visites=0;

            try{
                visites=dao.nombreVisites(id);

            }catch (HibernateException e){
                    this.getLogexuoc().error("Error accecint a la bdd per obtenir les visites de l'ítem :{}",id.toString());

            }catch (NoExisteixException e){
                    this.getLogexuoc().error("L'id indicat no existeix. Id :{}",id.toString());
            }catch (BuitException e){
                    this.getLogexuoc().error("L'id indicat no existeix. Id :{}",id.toString());
            }
        return visites;
    }



   /**************************************
    * MAIN
    */


  
}
